package model.editormodel;

import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import view.UtilityConstants;
import controller.commoncontroller.UtilityDialogs;

/**
 * <b>Erbt:</b> <code>Observable</code> <br>
 * <b>Zugehoerige Observer:</b> <code>ComponentPanel</code> <br>
 * <b>In Verbindung stehende Klassen:</b> <code>LocsiParser, CircuitModel</code><br>
 * <b>Funktion:</b> Verwalten der selbstdefinierten Bauteile <br>
 * <br>
 * In dieser Klasse werden die selbstdefinierten Bauteile fuer die
 * Bauteilauswahlliste verwaltet. Beim Starten des Programms bzw. beim Speichern
 * eines neuen Bauteils gibt der <code>ComponentHandler</code> dem
 * <code>LocsiParser<code> die Anweisung alle selbstdefinierten Bauteile
 *  einzulesen bzw. als XML-Datei zu speichern. Diese Klasse wird von 
 * <code>ComponentPanel</code> ueberwacht.
 * 
 * @author Team Locsi
 * 
 */
public class ComponentHandler extends Observable {
	private File sdirectory;
	private FilenameFilter filter;

	/**
	 * Dieser Konstruktor erzeugt ein neues <code>ComponentHandler</code>
	 * -Objekt.
	 * 
	 * @param parser
	 *            <code>LocsiParser</code> - Referenz auf den
	 *            <code>LocsiParser</code>
	 */
	protected ComponentHandler() {
		this.sdirectory = new File(UtilityConstants.SD_DIRECTORY);
		
		//falls der ordner für die selbstdefinierten bauteile nicht existiert
		//bzw geloescht wurde, wird er neu erstellt.
		if (!sdirectory.exists()) {
			sdirectory.mkdir();
		}
		
		//erzwingt, dass der componenthandler nur .xml dateien anzeigt
		this.filter = new FilenameFilter() {

			@Override
			public boolean accept(File dir, String name) {
				return (name.endsWith(UtilityDialogs.XML_EXTENSION));
			}
		};
	}

	/**
	 * Aktualisiert die Liste mit den selbstdefinierten Bauteilen, indem diese
	 * Methode dem Observer eine Liste von Strings, welche die Namen bzw. Files
	 * aller sich im sdirectory xml-Dateien, uebergibt. 
	 */
	public void refreshComponentList() {
		
		//falls der ordner für die selbstdefinierten bauteile nicht existiert
		//bzw geloescht wurde, wird er neu erstellt.
		if (!sdirectory.exists()) {
			sdirectory.mkdir();
		}
		File[] compFiles = sdirectory.listFiles(filter);
		List<String> compNames = new ArrayList<String>();

		//von jeder gefundenen .xml datei wird das .xml hinten abgeschnitten
		//und der uebriggebliebene name in die liste der namen eingefuegt
		for (File file : compFiles) {
			String[] splitted = file.getName().split(UtilityDialogs.XML_EXTENSION);
			if (splitted.length > 0) {
				compNames.add(splitted[0]);
			}
		}

		//ComponentPanel wird benachrichtigt
		setChanged();
		notifyObservers(compNames);
	}
}